package com.thx.user.service;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.thx.common.datasource.DataSource;
import com.thx.common.service.BaseManager;
import com.thx.common.util.AppContext;
import com.thx.common.util.PasswordUtil;
import com.thx.common.web.WebConstant;
import com.thx.user.dao.UserDao;
import com.thx.user.model.User;

/**
 * 建立日期 : Jul 31, 2012 4:32:46 PM<br>
 * 作者 : 贾红磊<br>
 * 模块 : <br>
 * 描述 : <br>
 * 修改历史: 序号 日期 修改人 修改原因 <br>
 * 1 <br>
 * 2 <br>
 */
@Service
@DataSource("dataSourceB")
@Transactional(readOnly = true)
public class UserManager extends BaseManager<User> {

	@Autowired
	private UserDao userDao;

	public UserDao getUserDao() {
		return userDao;
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	@Transactional(readOnly = false)
	public void save(User user) {
		String userId = user.getUserId();
		//如果是新增用户，对盐和密码做特殊的处理
		if(userId == null || userId.length() <= 0) {
			UUID uuid = UUID.randomUUID();
			user.setSalt(uuid.toString());
			String pwd = PasswordUtil.encrypt(user.getPassword(), user.getSalt());
			user.setPassword(pwd);
			//加密类型
			String algorithmName = AppContext.getProperties(WebConstant.ENCRYPTED_TYPE);
			user.setPwdFormat(algorithmName);
		}
		super.save(user);
	}
	
	@Transactional(readOnly = false)
	public void delStatus(Serializable... ids) {
		if (ids != null && ids.length > 0) {
			for (Serializable id : ids) {
				User user = this.get(id);
				user.getRoles().clear();
				user.setStatus("0");
				save(user);
			}
				
		}
	}

	public List<User> searchUsers(List<String> exldUserIds,String realName) {
		return userDao.searchUsers(exldUserIds,realName);
	}
	
	public List<User> searchUser(String userName,String realName,String email,String mobilePhone,String depId) {
		return userDao.searchUser(userName,realName,email,mobilePhone,depId);
	}


	public User findByName(String userName) {
		return userDao.findByUserName(userName);
	}
	
	public User findByPhone(String mobilePhone) {
		return userDao.findByPhone(mobilePhone);
	}
	
	public User findByEmail(String email) {
		return userDao.findByEmail(email);
	}
	
	public User findByNameAndPasswd(String userName, String passwd) {
		return userDao.findByNameAndPasswd(userName, passwd);
	}
	
	public User findByPhoneAndPasswd(String phone, String passwd) {
		return userDao.findByPhoneAndPasswd(phone, passwd);
	}
	
	public List<User> findByDeptId(String deptId) {
		return userDao.findByDeptId(deptId);
	}
	
	public User findByDeviceIdAndImsi(String userName, String deviceId, String imsi) {
		return userDao.findByDeviceIdAndImsi(userName, deviceId, imsi);
	}
	
	public User findByPwd(String userId, String deviceId, String imsi) {
		return userDao.findByPwd(userId, deviceId, imsi);
	}
	/**
	 * 记录用户登录失败信息
	 * @author Xuejw 2016年5月10日 下午3:15:50
	 * @param userId 登录用户id
	 * @param failedCount 失败次数
	 * @param failedDate 失败日期
	 * @return
	 */
	@Transactional(readOnly = false)
	public int saveloginErrorInfo(String userId,int failedCount,Date failedDate){
		return userDao.saveloginErrorInfo(userId,failedCount,failedDate);
	}
	/**
	 * 记录用户成功登录系统，并清除登录失败记录
	 * @author Xuejw 2016年5月10日 下午3:16:06
	 * @param userId 登录用户id
	 * @param loginDate 登录时间
	 * @return
	 */
	@Transactional(readOnly = false)
	public int saveloginSuccessInfo(String userId,Date loginDate){
		return userDao.saveloginSuccessInfo(userId,loginDate);
	}
	/**
	 * 记录密码修改信息
	 * @author Xuejw 2016年5月11日 下午6:00:41
	 * @param operUserId
	 * @param userId
	 * @param updateDate
	 * @return
	 */
	@Transactional(readOnly = false)
	public int saveUpPwdInfo(String operUserId,String userId,Date updateDate){
		return userDao.saveUpPwdInfo(operUserId,userId,updateDate);
	}
}
